package cn.tannn.ops.util;

import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * 命令工具
 *
 * @author <a href="https://t.tannn.cn/">tan</a>
 * @version V1.0
 * @date 2024/12/26 15:18
 */
@Slf4j
public class CommandUtil {

    /**
     * 通过 PID 获取 Java 进程的 JAR 文件名
     *
     * @param pid     进程 ID
     * @param session SSH 会话
     * @return 返回 JAR 文件名
     * @throws JSchException
     * @throws IOException
     */
    public static String getJarNameByPid(int pid, Session session)  {
        ChannelExec channel = null;
        InputStream in = null;
        BufferedReader reader = null;
        try {
            // 使用 ps 命令来获取 Java 进程的启动命令
            channel = (ChannelExec) session.openChannel("exec");
            channel.setCommand("ps -p " + pid + " -o command="); // 获取进程启动命令
            in = channel.getInputStream();
            reader = new BufferedReader(new InputStreamReader(in));

            // 连接通道
            channel.connect();

            String commandLine = reader.readLine();
            if (commandLine != null && commandLine.contains("-jar")) {
                // 解析出 JAR 文件路径
                String[] parts = commandLine.split(" ");
                for (String part : parts) {
                    if (part.endsWith(".jar")) {
                        return part.substring(part.lastIndexOf("/") + 1); // 返回 JAR 文件名
                    }
                }
            }
        } catch (Exception e) {
           log.error("find java process error", e);
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
               log.error("find java process error", e);
            }
            if (channel != null && channel.isConnected()) {
                channel.disconnect();
            }
        }
        return null; // 如果没有找到 JAR 文件
    }
}
